package com.mh.utils;

import com.mh.constant.WxPayJsApiConstant;
import com.wechat.pay.contrib.apache.httpclient.auth.PrivateKeySigner;
import com.wechat.pay.contrib.apache.httpclient.util.PemUtil;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.security.PrivateKey;
import java.util.ArrayList;

/**
 * 签名相关工具类
 */
@Component
public class WxPayJsApiSignUtil {

    /**
     * 证书序列号
     **/
    @Value("${wxPay.jsApi.mchSerialNo}")
    String mchSerialNo;

    /**
     * 获取签名
     * @param message 构造签名需要的4个参数的byte数组
     * @return  ·
     */
    public String signV3(byte[] message) throws IOException {
        // 构建 - 签名工具类
        PrivateKeySigner privateKeySigner = new PrivateKeySigner(mchSerialNo, getPrivateKey(WxPayJsApiHttpUtil.getResourcesPath() + WxPayJsApiConstant.SIGN_API_CLIENT_KEY));
        return privateKeySigner.sign(message).getSign();
    }

    /**
     * 获取私钥。
     * @param filename 完整证书路径名称
     */
    public static PrivateKey getPrivateKey(String filename) throws IOException {
        String content = new String(Files.readAllBytes(Paths.get(filename)), "utf-8");
        return PemUtil.loadPrivateKey(content);
    }

    /**
     * 转换 - 加密数据
     * @param signMessage 签名信息，将需要的列表，包含4个参数，使用\n进行分离后返回，进行签名加密操作
     * @return ·
     */
    public static String buildSignMessage(ArrayList<String> signMessage) {
        if (signMessage == null || signMessage.size() <= 0) {
            return null;
        }
        StringBuilder sbf = new StringBuilder();
        for (String str : signMessage) {
            sbf.append(str).append("\n");
        }
        return sbf.toString();
    }
}
